// 逻辑运算符：||(或) &&(与) !(非)

// ||(或)：从左往右依次计算，当比较的操作数不是布尔值时，会先转换成布尔值，然后返回第一个为 true 的操作数的初始值，否则返回最后一个操作数的初始值。
console.log(1 || 0) // 1
console.log(null || 0) // 0
console.log(undefined || 0) // 0
console.log(false || true) // true

// 获取第一个真值
let firstName = ''
let lastName = ''
let nickName = '小明'
let myName = firstName || lastName || nickName || '未知'
console.log(myName) // 小明

// 短路求值
true || showMsg1()
false || showMsg2() // 会执行

function showMsg1() {
	console.log('显示消息1')
}

function showMsg2() {
	console.log('显示消息2')
}

// **********************************************************************************************************************************************

// &&(与)：从左往右依次计算，当比较的操作数不是布尔值时，会先转换成布尔值，然后返回第一个为 false 的操作数的初始值，否则返回最后一个操作数的初始值。
// 与运算符 优先级高于 或运算符。
console.log((1 && 0) || (2 && 3)) // 3

// **********************************************************************************************************************************************

/* !(非)：先将操作数转换成布尔值，再取反值。 */

console.log(!0) // true
console.log(!!0) // false

// 非运算符 ! 的优先级在所有逻辑运算符里面最高，所以它总是在 && 和 || 之前执行。
